package com.elm.framework;

import com.fasterxml.jackson.databind.ObjectMapper;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.Method;

/**
 * 自定义前端控制器 拦截url格式要求： /控制器类名/控制器方法名
 */
@WebServlet("/")
public class DispatcherServlet extends HttpServlet {
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 中文编码处理
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		response.setContentType("application/json;charset=utf-8");
		// 获取客户端请求路径(/HelloController/say)
		String path = request.getServletPath();
		// 根据请求路径，将Controller的类名和方法名解析出来
		String className = path.substring(1, path.lastIndexOf("/"));
		String methodName = path.substring(path.lastIndexOf("/") + 1);
		PrintWriter out = null;
		// 判断请求路径，根据不同的请求，分发给不同的业务处理器
		try {
			// 通过Controller类全名获取此类的所有信息
			Class clazz = Class.forName("com.elm.controller." + className);
			// 创建Controller类的对象
			Object controller = clazz.newInstance();
			// 获取Controller类对象中的方法
			Method method = clazz.getMethod(methodName, new Class[] { HttpServletRequest.class });
			// 调用上面获取的方法
			Object result = method.invoke(controller, new Object[] { request });
			// 获取向客户端响应的输出流
			out = response.getWriter();
			ObjectMapper om = new ObjectMapper();
			// 向客户端响应json数据
			out.print(om.writeValueAsString(result));
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("DispatcherServlet信息：请求url：" + path);
			System.out.println("DispatcherServlet信息：类名：" + className + "\t方法名：" + methodName);
		} finally {
			out.close();
		}
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doPost(request, response);
	}
}